import config from '../../../config/env.js';
import useStore from '@/store/store.js';
const store = useStore();

let websocket = null;
let rec = null;
let websocketUrl = `${config.WEBSOCKET_BASE_URL}?token=${store.userData.token}`;

// 创建websocket
function creatWebSocket() {
	// 判断当前浏览器是否支持WebSocket
	if ("WebSocket" in window) {
		console.log("当前浏览器支持 WebSocket");
	} else if ("MozWebSocket" in window) {
		console.log("当前浏览器支持 MozWebSocket");
	} else {
		console.log("当前浏览器不支持 WebSocket");
	}
	try {
		initWebSocket(websocketUrl); // 初始化websocket连接
	} catch (e) {
		console.log("尝试创建连接失败");
		reConnect(websocketUrl); // 如果无法连接上 webSocket 那么重新连接！可能会因为服务器重新部署，或者短暂断网等导致无法创建连接
	}
}

// 初始化websocket
function initWebSocket() {
	websocket = new WebSocket(websocketUrl);
	console.log("websocket:", websocket);

	websocket.onopen = function() {
		websocketOpen();
	};

	// 接收
	websocket.onmessage = function(e) {
		websocketonmessage(e);
	};

	// 连接发生错误
	websocket.onerror = function() {
		console.log("WebSocket连接发生错误");
		reConnect(websocketUrl); // 连接错误 需要重连
	};

	websocket.onclose = function(e) {
		websocketclose(e);
	};
}

// 定义重连函数
let reConnect = () => {
	console.log("尝试重新连接");
	if (store.isConnected) return; // 如果已经连上就不在重连了
	rec && clearTimeout(rec);
	rec = setTimeout(function() {
		// 延迟5秒重连  避免过多次过频繁请求重连
		creatWebSocket(websocketUrl);
	}, 5000);
};

// 创建连接
function websocketOpen() {
	console.log("websocket连接成功");
	store.isConnected = true
}
// 数据接收
function websocketonmessage(e) {
	console.log("数据接收", e.data);
	const data = JSON.parse(e.data); // 解析JSON格式的数据
	store.isNewMsg = true;
}

// 关闭
function websocketclose(e) {
	store.isConnected = false
}

// 数据发送
function websocketsend(data) {
	console.log("发送的数据", data, JSON.stringify(data));
	if (websocket && store.isConnected) { // 检查连接状态
		websocket.send(JSON.stringify(data));
	} else {
		console.log('请选择设备连接');
	}
}

// 发送
function sendWebSocket(data) {
	// 如果未保持连接状态 不允许直接发送消息 提示请选择连接设备
	if (!store.isConnected) {
		console.log('请选择设备连接');
	} else {
		websocketsend(data);
	}
}

// 关闭
let closeWebSocket = () => {
	if (websocket) {
		websocket.close();
		store.$patch({
			isConnected: false
		});
		console.log('设备已关闭');
	}
};

export {
	initWebSocket,
	sendWebSocket,
	creatWebSocket,
	closeWebSocket,
};